package com.coolingme.dynamicproxy.cglibproxy;

import net.sf.cglib.core.DebuggingClassWriter;

/**
 * jdk动态代理测试
 *
 * @author wangyue
 * @date 2020/9/30 14:52
 */
public class Test {

    public static void main(String[] args) {
        //JDK是采用读取接口的信息
        //CGLib覆盖父类方法
        //目的：都是生成一个新的类，去实现增强代码逻辑的功能

        //JDK Proxy 对于用户而言，必须要有一个接口实现，目标类相对来说复杂
        //CGLib 可以代理任意一个普通的类，没有任何要求
        // 所以Spring的自动注入代理中，有接口的用JDK代理，没接口的用CGLib代理

        //CGLib 生成代理逻辑更复杂，效率,调用效率更高，生成一个包含了所有的逻辑的FastClass，不再需要反射调用
        //JDK Proxy生成代理的逻辑简单，执行效率相对要低，每次都要反射动态调用

        //CGLib 有个坑，CGLib不能代理final的方法

        //将CGLib 代理后的.lass文件写入磁盘，然后反编译来一探究竟
        String cglib_proxy_classes = System.getProperty("user.dir") + "\\pattern-05-proxy\\src\\main\\java\\com\\coolingme\\dynamicproxy\\cglibproxy\\cglib_proxy_classes";
        System.out.println(cglib_proxy_classes);
        System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, cglib_proxy_classes);

        CGlibMatchMaker cGlibMatchMaker = new CGlibMatchMaker();

        RichMan richMan = (RichMan) cGlibMatchMaker.getInstance(RichMan.class);
        richMan.findLove();

        HonestMan honestMan = (HonestMan) cGlibMatchMaker.getInstance(HonestMan.class);
        honestMan.findLove();

        PoolMan poolMan = (PoolMan) cGlibMatchMaker.getInstance(PoolMan.class);
        poolMan.findLove();
    }

}
